\begin{section}{Desarrollo}
La implementación del programa pedido en el enunciado consta de varias partes: 
\begin{itemize}
	\item Cálculo de la parametrización especificada.
	\item Cálculo del Spline, dados los puntos de control y la parametrización.
	\item Cálculo del punto más cercano al spline dado el punto de {\em click}
	\item Mover el punto encontrado a otro punto arbitrario.
	\item Recalcular el Spline con la nueva información.
\end{itemize}

\begin{subsection}{Cálculo de la parametrización}
Al tener que interpolar una curva, hace falta especificar una parametriza\-ción para relacionar la coordenada $x$ con la coordenada $y$ de los $n$ puntos de control dados (que llamaremos \cp). A este parámetro lo llamaremos $t$ a lo largo de todo el trabajo. La parametrización calculada siempre está en el intervalo $[0,1]$ y por facilidad de implementación y eficiencia se precalculan antes de comenzar con el cálculo del spline. Cada método de parametrización tiene un algoritmo distinto, detallado a continuación.
	
	\begin{subsubsection}{Parametrización uniforme}
		En la parametrización uniforme la variación del parámetro es igual entre cualquier par de puntos consecutivos. Por lo tanto, para calcular el valor del parámetro $t$ en cada punto, dividimos el intervalo por la cantidad de puntos menos uno y precalculamos un $t$ para cada punto a muestrear:
		$$ t_i = \frac{i}{n-1}\hspace{1cm}\text{con } 0 \leq i < n $$
		De esta forma cada subintervalo de la parametrización tiene la misma longitud.
	\end{subsubsection}

	\begin{subsubsection}{Parametrización {\em chord-length}}
		En la parametrización {\em chord-length} la variación del parámetro entre dos puntos consecutivos es proporcional a la distancia entre los mismos. Por lo tanto, para calcular el valor de $t$ en cada punto, calculamos la distancia $d$ entre cada par de puntos consecutivos y luego cada $t$ es la suma de la distancia de todos los $t$ anteriores más la distancia calculada en ese subintervalo. Para que cada intervalo sea proporcional a la distancia total, dividimos cada $t$ por la distancia entre el primer y último punto:
		\begin{align*}
			    d_0 &= 0 \\
			d_{i+1} &= d_i + \|\cp_{i+1}-\cp_i\|  &\text{con } 0 \leq i < n-1   \\
			    t_i &= \frac{d_i}{d_{n-1} }       &\text{con } 0 \leq i < n 
		\end{align*}
	\end{subsubsection}

	\begin{subsubsection}{Parametrización centrípeta}
		El cálculo de la parametrización centrípeta es igual al de la {\em chord-length} salvo que se redefine:
		\begin{align*}
			    d_0 &= 0 \\
			d_{i+1} &= d_i + \sqrt{\|\cp_{i+1}-\cp_i\|}  &\text{con } 0 \leq i < n-1   \\
		\end{align*}
			
	\end{subsubsection}

\end{subsection}

\begin{subsection}{Cálculo de la Spline}
	Dependiendo de la parametrización elegida, se calcularon dos splines con dicha parametrización: $S_{x}$ para la coordenada $x$ de los puntos de control y $S_{y}$ para los del eje $y$. Los puntos de control asignados a cada spline son $(t_i,x_i)$ y $(t_i,y_i)$ respectivamente, siendo $x_i$ la coordenada $x$ del punto de control $i$, y $y_i$ su coordenada en el eje $y$. El algoritmo utilizado para el cálculo de los poliomios de cada spline es el descripto en el libro {\em Análisis Numérico} de Burden\footnote{Ver \textsf{Algoritmo 3.4} en {\em Análisis Numérico}\cite{burden} }. Con ambos splines calculados, se puede obtener cada punto de la curva interpolada mediante el par $(S_x(t),S_y(t))$.
\end{subsection}

\begin{subsection}{Cálculo del punto más cercano de la curva a un punto dado}
	El algorítmo que se desarrolló para encontrar el punto más cercano a la curva, busca minimizar la distancia entre el punto dado $(p_x,p_y)$ y la curva interpolada. Para ello, primero busca minimizar la distancia $D_i$ al fragmento $i$-ésimo de la spline comprendido entre los puntos de control $\cp_i$ y $\cp_{i+1}$, así luego la distancia mínima a la curva es el mínimo entre los mínimos de cada $D_i$. Aprovechando que la función distancia es una función no negativa monótona creciente, tomamos cada $D_i$ como el cuadrado de la distancia, ya que simplifica los cálculos y mantiene los mismos puntos críticos que la función original:
	\begin{align*}
		D_i(t) &= \|(p_x,p_y)-(S_x(t),S_y(t))\|^2 \\
		       &= \|(p_x-S_x(t),p_y-S_y(t))\|^2 \\
		       &= (p_x-S_x(t))^2 + (p_y-S_y(t))^2
	\end{align*}
Luego para analizar los puntos críticos calculamos la derivada de $D_i$:
	\begin{align*}
		D'_i(t) &= -2 (p_x-S_x(t)) S'_x(t) - 2 (p_y-S_y(t)) S'_y(t)
	\end{align*}
Entonces necesitamos buscar los $t$ tales que $D'_i(t)=0$. Para hallar los ceros dividimos cada intervalo en 100 subintervalos iguales y utilizamos el método de la bisección combinado con el método de Newton. Para poder aplicar bisección, se requiere que los extremos del intervalo en donde se va a aplicar tengan signos opuestos. Al iterar por cada subintervalo, buscamos un cambio de signo. Al encontrar un intervalo que cumple con esta condición, aplicamos 50 iteraciones del método de la bisección y continuamos a partir del punto obtenido (cercano a la raíz) con el método de Newton, que se detiene al llegar al límite de 20 iteraciones, o bien al estar ``cerca'' del cero\footnote{Valores analizados en la sección \textsf{Discusión}}. En el caso de que en el subintervalo no se pueda aplicar bisección, se aplica Newton directamente. De esta manera, nos garantizamos acercarnos al cero con el método de la bisección (si se puede) y una vez de que estamos cerca, el método de Newton converge a la raíz rápidamente. Al aplicar este procedi\-miento en todos los subintervalos, es bastante probable encontrar las raíces del polinomio.

Una vez obtenidos los ceros $r_1,\dots, r_5$ de la derivada, nos quedamos con el $r_{min}$ que tiene distancia mínima y lo comparamos con la distancia evaluada en los extremos del intervalo. De esta manera obtenemos el punto con distancia mínima a la curva.
\end{subsection}

\begin{subsection}{Cálculo del nuevo Spline}
Luego de encontrar el punto más cercano, se procede a cambiarlo de lugar, es decir, al mismo valor que ocupaba ese punto en la parametrización se le asigna otro par $(x,y)$ en el plano, y -- en caso de que no lo sea -- se lo agrega como punto de control. Una vez agregado el nuevo punto de control o modificado el valor si éste ya era uno, se recalcula el spline de la misma forma que se calculó el original, pero sin cambiar la parametrización inicial. 
\end{subsection} 

\end{section}

